package com.ruoyi.system.Utils;

public class Test {

    // CRC-16的多项式，这里使用的是CRC-16/X-25的多项式
    private static final int POLYNOMIAL = 0x1021;

    // CRC-16的初始值
    private static final int INITIAL_VALUE = 0xFFFF;

    // 16位CRC校验码的生成函数，返回2字节的数组
    public static byte[] generateCRC(byte[] data) {
        int crc = INITIAL_VALUE; // 以初始值开始

        for (byte b : data) {
            crc ^= b & 0xFF; // 将数据字节与CRC值进行异或操作

            for (int i = 8; i != 0; i--) { // 处理8位数据
                if ((crc & 0x0001) != 0) {
                    crc >>= 1;
                    crc ^= POLYNOMIAL;
                } else {
                    crc >>= 1;
                }
            }
        }

        // 将CRC值转换为2字节的数组
        byte[] crcBytes = new byte[2];
        crcBytes[0] = (byte) ((crc >> 8) & 0xFF); // 高字节
        crcBytes[1] = (byte) (crc & 0xFF);         // 低字节

        return crcBytes;
    }

    // 测试函数
    public static void main(String[] args) {
        byte[] data = "Hello, World".getBytes();
        byte[] crcBytes = generateCRC(data);
        System.out.println("The CRC-16 checksum bytes are: ");
        for (byte b : crcBytes) {
            System.out.printf("0x%02X ", b);
        }
    }
}
